home *** CD-ROM | disk | FTP | other *** search
- /*
- seer desk accessory main routine
- */
-
- #include "sd.h"
- #include <DeviceMgr.h>
- #include "localDeviceMgr.h" /*get a real cntrlParam definition*/
-
- /*
- format of the control parameter for a desk accessory
- */
- struct da_menu_rec_R {
- int a_menu;
- int a_item;
- };
- typedef struct da_menu_rec_R da_menu_rec;
-
- typedef struct {
- cntrlParam_header nc_cp;
- union {
- EventRecord *nc_event;
- da_menu_rec nc_item;
- }x;
- } XX_ctl;
-
- /*this isn't really a routine, the address of the seer data is stored
- (patched into) here when seer starts up
- */
- void real_sr_a4()
- {asm {
- dc.l 0 /*0 means that the storage isn't setup yet*/
- }
- };
-
- void load_global_rtn()
- {asm{ lea real_sr_a4,GLOBAL_REG
- move.l (GLOBAL_REG),GLOBAL_REG}
- }
-
- /*define the LightspeedC entry parameters for main*/
- #define LS_open 0
- #define LS_prime 1
- #define LS_control 2
- #define LS_status 3
- #define LS_close 4
-
- /*
- LightSpeedC arranges for all device driver calls to come here.
- The 'entry' parameter specifies the type of call.
- */
- int main(XX_ctl *,DCtlPtr,int);
- int main(pb, dce, entry)
- register XX_ctl *pb;
- register DCtlPtr dce;
- register int entry;
- {asm { /*setup a pointer to our global data*/
- lea real_sr_a4,a0 /*save data pointer for interrupt routines*/
- move.l a4,(a0)
- };
- mydce=dce;
- gl.bomb_active=0; /*fatal error handler is not active*/
- if(setjmp(gl.seer_exit_lngjmp)!=0) /*set a place to throw errors*/
- return noErr; /*quit the device*/
- /*handle the different device driver entry points*/
- switch(entry) {
- case LS_control:
- {register int err,op;
- GrafPtr save_port;
- extern we_are_open;
- if(!we_are_open) /*ignore control calls if open went wrong */
- break;
- GetPort(&save_port);
- SetPort(CUR_WINDOW);
- op=pb->nc_cp.csCode;
- switch(op) {
- case accRun:
- check_paks_in_Q();
- scope_tick();
- break;
- case accEvent:
- do_event(pb->x.nc_event);
- break;
- case accCursor:
- break;
- case goodBye:
- do_close();
- break;
- case accMenu:
- do_seer_menu(pb->x.nc_item.a_item);
- break;
- case killCode:
- case accUndo:
- case accCut:
- case accCopy:
- case accPaste:
- case accClear:
- break;
- default:
- break;
- }
- SetPort(save_port);
- return noErr;
- break;
- }
- case LS_open:
- return do_open();
- break;
- case LS_prime:
- return -19; /*we shouldn't get read/writes*/
- break;
- case LS_status:
- return -18; /*we shouldn't get status errors*/
- break;
- case LS_close:
- do_close();
- break;
- default:
- ;
- }
- return noErr;
- }